#!/bin/bash

# we_ai_portal 应用启动脚本
# 项目结构:
# - we_ai_portal/lib/ - JAR文件位置
# - we_ai_portal/conf/ - 配置文件位置
# - we_ai_portal/logs/ - 日志文件位置

# 彩色输出函数
function log_info() {
    echo -e "\033[1;32m[INFO] $1\033[0m"
}

function log_error() {
    echo -e "\033[1;31m[ERROR] $1\033[0m"
}

function log_warn() {
    echo -e "\033[1;33m[WARN] $1\033[0m"
}

# 确定脚本所在目录，以定位整个应用结构
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"  # 假设脚本位于bin目录下

# 定义关键目录
LIB_DIR="$ROOT_DIR/lib"
CONF_DIR="$ROOT_DIR/conf"
LOG_DIR="$ROOT_DIR/logs"
PID_FILE="$ROOT_DIR/application.pid"

# 应用名称和JAR文件
APP_NAME="we_ai_portal"
JAR_FILE=$(find "$LIB_DIR" -name "*.jar" | head -n 1)

if [ -z "$JAR_FILE" ]; then
    log_error "在 $LIB_DIR 目录中找不到JAR文件"
    exit 1
fi

log_info "使用JAR文件: $(basename "$JAR_FILE")"

# 确保日志目录存在
mkdir -p "$LOG_DIR"

# 检查应用是否已经在运行
if [ -f "$PID_FILE" ]; then
    PID=$(cat "$PID_FILE")
    if ps -p "$PID" > /dev/null 2>&1; then
        log_warn "应用 $APP_NAME 已经在运行中，PID: $PID"
        log_warn "如需重启，请先运行 ./stop.sh"
        exit 1
    else
        log_warn "发现过期的PID文件，将继续启动应用"
    fi
fi

# 设置Java选项
JAVA_OPTS="-Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_DIR"

# 设置系统属性，而不是命令行参数
# 设置日志目录的系统属性，让logback配置文件可以引用
SYS_PROPS="-Dapp.log.dir=$LOG_DIR"

# 如果有logback配置文件，使用它
if [ -f "$CONF_DIR/logback-spring.xml" ]; then
    SYS_PROPS="$SYS_PROPS -Dlogging.config=file:$CONF_DIR/logback-spring.xml"
    log_info "使用日志配置: $CONF_DIR/logback-spring.xml"
else
    log_warn "未找到logback配置文件，将使用默认日志配置"
    # 只有在没有logback配置文件时才设置基本日志属性
    SYS_PROPS="$SYS_PROPS -Dlogging.file.path=$LOG_DIR -Dlogging.file.name=$LOG_DIR/application.log"
fi

# 启动应用
log_info "正在启动 $APP_NAME..."

nohup ../../jdk-23.0.2/bin/java $JAVA_OPTS $SYS_PROPS \
    -jar "$JAR_FILE" \
    --spring.config.location=file:$CONF_DIR/application.properties \
    > "$LOG_DIR/startup.log" 2>&1 &

# 获取PID并保存
PID=$!
echo $PID > "$PID_FILE"

log_info "$APP_NAME 已启动，PID: $PID"
log_info "启动日志: $LOG_DIR/startup.log"
log_info "应用日志目录: $LOG_DIR"

# 等待应用启动
log_info "等待应用启动..."
sleep 5

# 检查应用是否成功启动
if ps -p "$PID" > /dev/null 2>&1; then
    log_info "$APP_NAME 成功启动！"
    # 尝试获取应用端口信息
    sleep 2
    PORT=$(grep -m 1 "Tomcat started on port" "$LOG_DIR/startup.log" | grep -o "[0-9]\+")
    if [ -n "$PORT" ]; then
        log_info "应用已在端口 $PORT 上启动"
    fi
else
    log_error "$APP_NAME 启动失败！请检查日志文件: $LOG_DIR/startup.log"
    exit 1
fi